This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Cmd+Shift+Enter.

library(tidyverse)
CHR2020=read_csv("/Users/yangdi/Desktop/import/2020CHR.csv")
New names:
• `95% CI - Low` -> `95% CI - Low...5`
• `95% CI - High` -> `95% CI - High...6`
• `# Deaths` -> `# Deaths...22`
• `95% CI - Low` -> `95% CI - Low...24`
• `95% CI - High` -> `95% CI - High...25`
• `# Deaths` -> `# Deaths...41`
• `95% CI - Low` -> `95% CI - Low...43`
• `95% CI - High` -> `95% CI - High...44`
• `# Deaths` -> `# Deaths...60`
• `95% CI - Low` -> `95% CI - Low...62`
• `95% CI - High` -> `95% CI - High...63`
• `95% CI - Low` -> `95% CI - Low...80`
• `95% CI - High` -> `95% CI - High...81`
• `95% CI - Low` -> `95% CI - Low...83`
• `95% CI - High` -> `95% CI - High...84`
• `95% CI - Low` -> `95% CI - Low...86`
• `95% CI - High` -> `95% CI - High...87`
• `95% CI - Low` -> `95% CI - Low...96`
• `95% CI - High` -> `95% CI - High...97`
• `95% CI - Low` -> `95% CI - Low...115`
• `95% CI - High` -> `95% CI - High...116`
• `95% CI - Low` -> `95% CI - Low...133`
• `95% CI - High` -> `95% CI - High...134`
• `# Uninsured` -> `# Uninsured...135`
• `% Uninsured` -> `% Uninsured...136`
• `95% CI - Low` -> `95% CI - Low...137`
• `95% CI - High` -> `95% CI - High...138`
• `# Uninsured` -> `# Uninsured...139`
• `% Uninsured` -> `% Uninsured...140`
• `95% CI - Low` -> `95% CI - Low...141`
• `95% CI - High` -> `95% CI - High...142`
• `95% CI - Low` -> `95% CI - Low...146`
• `95% CI - High` -> `95% CI - High...147`
• `Average Grade Performance` -> `Average Grade Performance...148`
• `Average Grade Performance (Asian)` -> `Average Grade Performance (Asian)...149`
• `Average Grade Performance (Black)` -> `Average Grade Performance (Black)...150`
• `Average Grade Performance (Hispanic)` -> `Average Grade Performance (Hispanic)...151`
• `Average Grade Performance (White)` -> `Average Grade Performance (White)...152`
• `Average Grade Performance` -> `Average Grade Performance...153`
• `Average Grade Performance (Asian)` -> `Average Grade Performance (Asian)...154`
• `Average Grade Performance (Black)` -> `Average Grade Performance (Black)...155`
• `Average Grade Performance (Hispanic)` -> `Average Grade Performance (Hispanic)...156`
• `Average Grade Performance (White)` -> `Average Grade Performance (White)...157`
• `95% CI - Low` -> `95% CI - Low...159`
• `95% CI - High` -> `95% CI - High...160`
• `95% CI - Low` -> `95% CI - Low...180`
• `95% CI - High` -> `95% CI - High...181`
• `# Deaths` -> `# Deaths...197`
• `95% CI - Low` -> `95% CI - Low...199`
• `95% CI - High` -> `95% CI - High...200`
• `95% CI - Low` -> `95% CI - Low...219`
• `95% CI - High` -> `95% CI - High...220`
• `95% CI - Low` -> `95% CI - Low...243`
• `95% CI - High` -> `95% CI - High...244`
• `95% CI - Low` -> `95% CI - Low...247`
• `95% CI - High` -> `95% CI - High...248`
• `95% CI - Low` -> `95% CI - Low...266`
• `95% CI - High` -> `95% CI - High...267`
Rows: 3193 Columns: 270
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): State, County, Other Primary Care Provider Ratio, Non-Petitioned Cases, Petitioned Cases
dbl (265): FIPS, Life Expectancy, 95% CI - Low...5, 95% CI - High...6, Life Expectancy (AIAN), Life Expectancy (AIAN) 95%...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# it's already tidy!
view(CHR2020)
CHR2021=read_csv("/Users/yangdi/Desktop/import/2021CHR.csv")
New names:
• `95% CI - Low` -> `95% CI - Low...5`
• `95% CI - High` -> `95% CI - High...6`
• `# Deaths` -> `# Deaths...22`
• `95% CI - Low` -> `95% CI - Low...24`
• `95% CI - High` -> `95% CI - High...25`
• `# Deaths` -> `# Deaths...41`
• `95% CI - Low` -> `95% CI - Low...43`
• `95% CI - High` -> `95% CI - High...44`
• `# Deaths` -> `# Deaths...60`
• `95% CI - Low` -> `95% CI - Low...62`
• `95% CI - High` -> `95% CI - High...63`
• `95% CI - Low` -> `95% CI - Low...80`
• `95% CI - High` -> `95% CI - High...81`
• `95% CI - Low` -> `95% CI - Low...83`
• `95% CI - High` -> `95% CI - High...84`
• `95% CI - Low` -> `95% CI - Low...86`
• `95% CI - High` -> `95% CI - High...87`
• `95% CI - Low` -> `95% CI - Low...96`
• `95% CI - High` -> `95% CI - High...97`
• `95% CI - Low` -> `95% CI - Low...115`
• `95% CI - High` -> `95% CI - High...116`
• `95% CI - Low` -> `95% CI - Low...133`
• `95% CI - High` -> `95% CI - High...134`
• `# Uninsured` -> `# Uninsured...135`
• `% Uninsured` -> `% Uninsured...136`
• `95% CI - Low` -> `95% CI - Low...137`
• `95% CI - High` -> `95% CI - High...138`
• `# Uninsured` -> `# Uninsured...139`
• `% Uninsured` -> `% Uninsured...140`
• `95% CI - Low` -> `95% CI - Low...141`
• `95% CI - High` -> `95% CI - High...142`
• `95% CI - Low` -> `95% CI - Low...148`
• `95% CI - High` -> `95% CI - High...149`
• `Average Grade Performance` -> `Average Grade Performance...150`
• `Average Grade Performance (Asian)` -> `Average Grade Performance (Asian)...151`
• `Average Grade Performance (Black)` -> `Average Grade Performance (Black)...152`
• `Average Grade Performance (Hispanic)` -> `Average Grade Performance (Hispanic)...153`
• `Average Grade Performance (White)` -> `Average Grade Performance (White)...154`
• `Average Grade Performance` -> `Average Grade Performance...155`
• `Average Grade Performance (Asian)` -> `Average Grade Performance (Asian)...156`
• `Average Grade Performance (Black)` -> `Average Grade Performance (Black)...157`
• `Average Grade Performance (Hispanic)` -> `Average Grade Performance (Hispanic)...158`
• `Average Grade Performance (White)` -> `Average Grade Performance (White)...159`
• `95% CI - Low` -> `95% CI - Low...161`
• `95% CI - High` -> `95% CI - High...162`
• `95% CI - Low` -> `95% CI - Low...182`
• `95% CI - High` -> `95% CI - High...183`
• `# Deaths` -> `# Deaths...199`
• `95% CI - Low` -> `95% CI - Low...201`
• `95% CI - High` -> `95% CI - High...202`
• `95% CI - Low` -> `95% CI - Low...221`
• `95% CI - High` -> `95% CI - High...222`
• `95% CI - Low` -> `95% CI - Low...245`
• `95% CI - High` -> `95% CI - High...246`
• `95% CI - Low` -> `95% CI - Low...249`
• `95% CI - High` -> `95% CI - High...250`
• `95% CI - Low` -> `95% CI - Low...253`
• `95% CI - High` -> `95% CI - High...254`
• `95% CI - Low` -> `95% CI - Low...272`
• `95% CI - High` -> `95% CI - High...273`
• `` -> `...277`
Rows: 3193 Columns: 277
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr   (6): FIPS, State, County, Other Primary Care Provider Ratio, Non-Petitioned Cases, Petitioned Cases
dbl (270): Life Expectancy, 95% CI - Low...5, 95% CI - High...6, Life Expectancy (AIAN), Life Expectancy (AIAN) 95% CI - ...
lgl   (1): ...277

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
CHR2020$FIPS=as.character(CHR2020$FIPS)
CHR=bind_rows(CHR2020, CHR2021)

#how to find unmatched columns? how to ignore them and continue?
library(tidyverse)
library(naniar)
rm(list=ls())
longdata = read_csv("/Users/yangdi/Desktop/import/chr_trends_csv_2021.csv")
Rows: 657649 Columns: 15
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (6): yearspan, measurename, statecode, countycode, county, state
dbl (6): numerator, denominator, measureid, chrreleaseyear, differflag, trendbreak

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
#view(longdata)
unique(longdata$yearspan)
 [1] "1997-1999" "1998-2000" "1999-2001" "2000-2002" "2001-2003" "2002-2004" "2003-2005" "2004-2006" "2005-2007" "2006-2008"
[11] "2007-2009" "2008-2010" "2009-2011" "2010-2012" "2011-2013" "2012-2014" "2013-2015" "2014-2016" "2015-2017" "2016-2018"
[21] "2017-2019" "2008"      "2009"      "2010"      "2011"      "2012"      "2013"      "2014"      "2015"      "2016"     
[31] "2017"      "2018"      "2002"      "2003"      "2004"      "2005"      "2006"      "2007"      "2019"     
yearindex=unique(longdata$yearspan)
test1=longdata %>% filter(yearspan %in% yearindex[1:21])
unique(test1$yearspan)
 [1] "1997-1999" "1998-2000" "1999-2001" "2000-2002" "2001-2003" "2002-2004" "2003-2005" "2004-2006" "2005-2007" "2006-2008"
[11] "2007-2009" "2008-2010" "2009-2011" "2010-2012" "2011-2013" "2012-2014" "2013-2015" "2014-2016" "2015-2017" "2016-2018"
[21] "2017-2019"
#create another for 22 til end
test2=longdata %>% filter(yearspan %in% yearindex[22:length(yearindex)])
unique(test2$yearspan)
 [1] "2008" "2009" "2010" "2011" "2012" "2013" "2014" "2015" "2016" "2017" "2018" "2002" "2003" "2004" "2005" "2006" "2007"
[18] "2019"
#how do i select a lot of variables?  variable.names(childpov), longdata[,1:9]
widedata = pivot_wider(test2, names_from = c(measurename), values_from = c(numerator, denominator, rawvalue, cilow, cihigh, measureid, chrreleaseyear, differflag, trendbreak))
#dim(widedata)
#head(widedata)
table(longdata$measurename)

                     Adult obesity Air pollution - particulate matter    Alcohol-impaired driving deaths 
                             44680                              47910                              38308 
               Children in poverty                           Dentists                   Flu vaccinations 
                             57440                              31940                              22358 
             Mammography screening                Physical inactivity                    Premature death 
                             22358                              44680                              67010 
        Preventable hospital stays            Primary care physicians    Sexually transmitted infections 
                             22358                              28746                              38298 
                 Unemployment rate                          Uninsured                   Uninsured adults 
                             57440                              35113                              35132 
                Uninsured children                 Violent crime rate 
                             35132                              28746 
childpov=subset(longdata, measurename=='Children in poverty')
table(childpov$yearspan)

2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012 2013 2014 2015 2016 2017 2018 2019 
3190 3190 3190 3190 3190 3190 3190 3190 3190 3190 3190 3190 3190 3194 3194 3194 3194 3194 
measures=unique(longdata$measurename)
#test3=childpov %>% order(yearspan)
test3=childpov %>% arrange(statecode, countycode, yearspan)
view(childpov)
dim(na.omit(childpov))
[1]  0 15
missplot=gg_miss_var(childpov)
view(missplot$data)
pct_miss(childpov)
[1] 22.2312
n_complete(childpov)
[1] 670056
measures = unique(longdata$measurename)
pct_miss_measure = numeric()
n_complete_measure = numeric()
missplotlist=list()
missplottable=list()
for (i in 1:length(measures)) {
  val = measures[i]
  measure = subset(longdata, measurename == val)
  table(measure$yearspan)
  #test3=measure %>% order(yearspan)
  #test3=measure %>% arrange(statecode, countycode, yearspan)
  #view(measure)
  #dim(na.omit(measure))
  missplotlist[[i]] = gg_miss_var(measure)
  missplottable[[i]]=missplot$data
  pct_miss_measure[i] = pct_miss(measure)
  n_complete_measure[i] = n_complete(measure)
}
res_t = tibble(measures, pct_miss_measure, n_complete_measure)  
library(VIM)
Loading required package: colorspace
Loading required package: grid
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
VIM is ready to use.

Suggestions and bug-reports can be submitted at: https://github.com/statistikat/VIM/issues

Attaching package: ‘VIM’

The following object is masked from ‘package:datasets’:

    sleep
library(FactoMineR)
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
library(missMDA)
library(naniar)
dim(na.omit(widedata))
[1]   0 131
missplot=gg_miss_var(widedata)
view(missplot$data)
pct_miss(widedata)
[1] 64.11781
n_complete(widedata)
[1] 2719466
#summarise(longdata, yearspan)
longdata = read_csv("/Users/yangdi/Desktop/import/chr_trends_csv_2021.csv")
Rows: 657649 Columns: 15
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (6): yearspan, measurename, statecode, countycode, county, state
dbl (6): numerator, denominator, measureid, chrreleaseyear, differflag, trendbreak

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
longdata=separate(longdata, yearspan, into=c("startyear", "endyear"), sep="-")
Warning: Expected 2 pieces. Missing pieces filled with `NA` in 501279 rows [67011, 67012, 67013, 67014, 67015, 67016, 67017, 67018, 67019, 67020, 67021, 67022, 67023, 67024, 67025, 67026, 67027, 67028, 67029, 67030, ...].
is.integer(longdata$startyear)
[1] FALSE
#how to covert char into integer?
longdata$startyear=as.integer(longdata$startyear)
longdata$endyear=as.integer(longdata$endyear)
#the results is crazily long. Can I have one answer?
all(longdata$startyear==longdata$endyear-2,na.rm = TRUE)
[1] TRUE
library(Hmisc)
Loading required package: lattice
Loading required package: survival
Loading required package: Formula

Attaching package: ‘Hmisc’

The following objects are masked from ‘package:dplyr’:

    src, summarize

The following objects are masked from ‘package:base’:

    format.pval, units
analytic2=read_csv(file = "/Users/yangdi/Desktop/import/analytic_data2021.csv")
Rows: 3195 Columns: 690
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (690): State FIPS Code, County FIPS Code, 5-digit FIPS Code, State Abbreviation, Name, Release Year, County Ranked (Y...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
view(analytic2)
firstrow=read_csv(file = "/Users/yangdi/Desktop/import/analytic_data2021.csv",  n_max = 1)
Rows: 1 Columns: 690
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (690): State FIPS Code, County FIPS Code, 5-digit FIPS Code, State Abbreviation, Name, Release Year, County Ranked (Y...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
view(firstrow)
varlabel=colnames(firstrow)
#view(varlabel)
analytic=read_csv(file = "/Users/yangdi/Desktop/import/analytic_data2021.csv", skip = 1)
Rows: 3194 Columns: 690
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr   (5): statecode, countycode, fipscode, state, county
dbl (559): year, county_ranked, v001_rawvalue, v001_numerator, v001_denominator, v001_cilow, v001_cihigh, v001_flag, v001...
lgl (126): v002_numerator, v002_denominator, v036_numerator, v036_denominator, v042_numerator, v042_denominator, v009_num...

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
library(viridis)
library(tidyverse)
library(usmap)
library(ggplot2)
library(plotly)
library(rjson)
childpov$fips = paste(childpov$statecode, childpov$countycode,sep="")
us_states = map_data("state")
us_counties = map_data("county")
plot_usmap(data=childpov, values="rawvalue")


#can't combine usmap with time-varying animation?

url = 'https://raw.githubusercontent.com/plotly/datasets/master/geojson-counties-fips.json'
counties = rjson::fromJSON(file=url)
g <- list(
  scope = 'usa',
  projection = list(type = 'albers usa'),
  showlakes = TRUE,
  lakecolor = toRGB('white')
)
childpov$yearspan=as.integer(childpov$yearspan)
plotmap1 = plot_ly(geojson=counties, locations=childpov$fips, z=childpov$rawvalue, colorscale="Viridis", zmin=0, zmax=1, type='choropleth')
plotmap2=plotmap1 %>%
  layout(title='Child poverty',
         geo = g)
print(plotmap2)
Warning: Ignoring 15 observations
Warning: Ignoring 15 observations
NULL

%>% animation_opts( frame = 100, transition = 0, redraw = FALSE) %>% animation_slider( currentvalue=list(prefix=“yearspan”)) %>% animation_button( x = 1, xanchor = “right”, y = 0, yanchor = “bottom”) Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Cmd+Option+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Cmd+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiQ291bnR5IEhlYWx0aCBSYW5rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiAKClRyeSBleGVjdXRpbmcgdGhpcyBjaHVuayBieSBjbGlja2luZyB0aGUgKlJ1biogYnV0dG9uIHdpdGhpbiB0aGUgY2h1bmsgb3IgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbnNpZGUgaXQgYW5kIHByZXNzaW5nICpDbWQrU2hpZnQrRW50ZXIqLiAKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKQ0hSMjAyMD1yZWFkX2NzdigiL1VzZXJzL3lhbmdkaS9EZXNrdG9wL2ltcG9ydC8yMDIwQ0hSLmNzdiIpCiMgaXQncyBhbHJlYWR5IHRpZHkhCnZpZXcoQ0hSMjAyMCkKQ0hSMjAyMT1yZWFkX2NzdigiL1VzZXJzL3lhbmdkaS9EZXNrdG9wL2ltcG9ydC8yMDIxQ0hSLmNzdiIpCkNIUjIwMjAkRklQUz1hcy5jaGFyYWN0ZXIoQ0hSMjAyMCRGSVBTKQpDSFI9YmluZF9yb3dzKENIUjIwMjAsIENIUjIwMjEpCgojaG93IHRvIGZpbmQgdW5tYXRjaGVkIGNvbHVtbnM/IGhvdyB0byBpZ25vcmUgdGhlbSBhbmQgY29udGludWU/CmBgYApgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobmFuaWFyKQpybShsaXN0PWxzKCkpCmxvbmdkYXRhID0gcmVhZF9jc3YoIi9Vc2Vycy95YW5nZGkvRGVza3RvcC9pbXBvcnQvY2hyX3RyZW5kc19jc3ZfMjAyMS5jc3YiKQojdmlldyhsb25nZGF0YSkKdW5pcXVlKGxvbmdkYXRhJHllYXJzcGFuKQp5ZWFyaW5kZXg9dW5pcXVlKGxvbmdkYXRhJHllYXJzcGFuKQp0ZXN0MT1sb25nZGF0YSAlPiUgZmlsdGVyKHllYXJzcGFuICVpbiUgeWVhcmluZGV4WzE6MjFdKQp1bmlxdWUodGVzdDEkeWVhcnNwYW4pCiNjcmVhdGUgYW5vdGhlciBmb3IgMjIgdGlsIGVuZAp0ZXN0Mj1sb25nZGF0YSAlPiUgZmlsdGVyKHllYXJzcGFuICVpbiUgeWVhcmluZGV4WzIyOmxlbmd0aCh5ZWFyaW5kZXgpXSkKdW5pcXVlKHRlc3QyJHllYXJzcGFuKQojaG93IGRvIGkgc2VsZWN0IGEgbG90IG9mIHZhcmlhYmxlcz8gIHZhcmlhYmxlLm5hbWVzKGNoaWxkcG92KSwgbG9uZ2RhdGFbLDE6OV0Kd2lkZWRhdGEgPSBwaXZvdF93aWRlcih0ZXN0MiwgbmFtZXNfZnJvbSA9IGMobWVhc3VyZW5hbWUpLCB2YWx1ZXNfZnJvbSA9IGMobnVtZXJhdG9yLCBkZW5vbWluYXRvciwgcmF3dmFsdWUsIGNpbG93LCBjaWhpZ2gsIG1lYXN1cmVpZCwgY2hycmVsZWFzZXllYXIsIGRpZmZlcmZsYWcsIHRyZW5kYnJlYWspKQojZGltKHdpZGVkYXRhKQojaGVhZCh3aWRlZGF0YSkKdGFibGUobG9uZ2RhdGEkbWVhc3VyZW5hbWUpCgpjaGlsZHBvdj1zdWJzZXQobG9uZ2RhdGEsIG1lYXN1cmVuYW1lPT0nQ2hpbGRyZW4gaW4gcG92ZXJ0eScpCnRhYmxlKGNoaWxkcG92JHllYXJzcGFuKQptZWFzdXJlcz11bmlxdWUobG9uZ2RhdGEkbWVhc3VyZW5hbWUpCiN0ZXN0Mz1jaGlsZHBvdiAlPiUgb3JkZXIoeWVhcnNwYW4pCnRlc3QzPWNoaWxkcG92ICU+JSBhcnJhbmdlKHN0YXRlY29kZSwgY291bnR5Y29kZSwgeWVhcnNwYW4pCnZpZXcoY2hpbGRwb3YpCmRpbShuYS5vbWl0KGNoaWxkcG92KSkKbWlzc3Bsb3Q9Z2dfbWlzc192YXIoY2hpbGRwb3YpCnZpZXcobWlzc3Bsb3QkZGF0YSkKcGN0X21pc3MoY2hpbGRwb3YpCm5fY29tcGxldGUoY2hpbGRwb3YpCgptZWFzdXJlcyA9IHVuaXF1ZShsb25nZGF0YSRtZWFzdXJlbmFtZSkKcGN0X21pc3NfbWVhc3VyZSA9IG51bWVyaWMoKQpuX2NvbXBsZXRlX21lYXN1cmUgPSBudW1lcmljKCkKbWlzc3Bsb3RsaXN0PWxpc3QoKQptaXNzcGxvdHRhYmxlPWxpc3QoKQpmb3IgKGkgaW4gMTpsZW5ndGgobWVhc3VyZXMpKSB7CiAgdmFsID0gbWVhc3VyZXNbaV0KICBtZWFzdXJlID0gc3Vic2V0KGxvbmdkYXRhLCBtZWFzdXJlbmFtZSA9PSB2YWwpCiAgdGFibGUobWVhc3VyZSR5ZWFyc3BhbikKICAjdGVzdDM9bWVhc3VyZSAlPiUgb3JkZXIoeWVhcnNwYW4pCiAgI3Rlc3QzPW1lYXN1cmUgJT4lIGFycmFuZ2Uoc3RhdGVjb2RlLCBjb3VudHljb2RlLCB5ZWFyc3BhbikKICAjdmlldyhtZWFzdXJlKQogICNkaW0obmEub21pdChtZWFzdXJlKSkKICBtaXNzcGxvdGxpc3RbW2ldXSA9IGdnX21pc3NfdmFyKG1lYXN1cmUpCiAgbWlzc3Bsb3R0YWJsZVtbaV1dPW1pc3NwbG90JGRhdGEKICBwY3RfbWlzc19tZWFzdXJlW2ldID0gcGN0X21pc3MobWVhc3VyZSkKICBuX2NvbXBsZXRlX21lYXN1cmVbaV0gPSBuX2NvbXBsZXRlKG1lYXN1cmUpCn0KcmVzX3QgPSB0aWJibGUobWVhc3VyZXMsIHBjdF9taXNzX21lYXN1cmUsIG5fY29tcGxldGVfbWVhc3VyZSkgIApgYGAKCmBgYHtyfQpsaWJyYXJ5KFZJTSkKbGlicmFyeShGYWN0b01pbmVSKQpsaWJyYXJ5KG1pc3NNREEpCmxpYnJhcnkobmFuaWFyKQpkaW0obmEub21pdCh3aWRlZGF0YSkpCm1pc3NwbG90PWdnX21pc3NfdmFyKHdpZGVkYXRhKQp2aWV3KG1pc3NwbG90JGRhdGEpCnBjdF9taXNzKHdpZGVkYXRhKQpuX2NvbXBsZXRlKHdpZGVkYXRhKQpgYGAKCmBgYHtyfQojc3VtbWFyaXNlKGxvbmdkYXRhLCB5ZWFyc3BhbikKbG9uZ2RhdGEgPSByZWFkX2NzdigiL1VzZXJzL3lhbmdkaS9EZXNrdG9wL2ltcG9ydC9jaHJfdHJlbmRzX2Nzdl8yMDIxLmNzdiIpCmxvbmdkYXRhPXNlcGFyYXRlKGxvbmdkYXRhLCB5ZWFyc3BhbiwgaW50bz1jKCJzdGFydHllYXIiLCAiZW5keWVhciIpLCBzZXA9Ii0iKQppcy5pbnRlZ2VyKGxvbmdkYXRhJHN0YXJ0eWVhcikKI2hvdyB0byBjb3ZlcnQgY2hhciBpbnRvIGludGVnZXI/CmxvbmdkYXRhJHN0YXJ0eWVhcj1hcy5pbnRlZ2VyKGxvbmdkYXRhJHN0YXJ0eWVhcikKbG9uZ2RhdGEkZW5keWVhcj1hcy5pbnRlZ2VyKGxvbmdkYXRhJGVuZHllYXIpCiN0aGUgcmVzdWx0cyBpcyBjcmF6aWx5IGxvbmcuIENhbiBJIGhhdmUgb25lIGFuc3dlcj8KYWxsKGxvbmdkYXRhJHN0YXJ0eWVhcj09bG9uZ2RhdGEkZW5keWVhci0yLG5hLnJtID0gVFJVRSkKYGBgCgoKYGBge3J9CmxpYnJhcnkoSG1pc2MpCmFuYWx5dGljMj1yZWFkX2NzdihmaWxlID0gIi9Vc2Vycy95YW5nZGkvRGVza3RvcC9pbXBvcnQvYW5hbHl0aWNfZGF0YTIwMjEuY3N2IikKdmlldyhhbmFseXRpYzIpCmZpcnN0cm93PXJlYWRfY3N2KGZpbGUgPSAiL1VzZXJzL3lhbmdkaS9EZXNrdG9wL2ltcG9ydC9hbmFseXRpY19kYXRhMjAyMS5jc3YiLCAgbl9tYXggPSAxKQp2aWV3KGZpcnN0cm93KQp2YXJsYWJlbD1jb2xuYW1lcyhmaXJzdHJvdykKI3ZpZXcodmFybGFiZWwpCmFuYWx5dGljPXJlYWRfY3N2KGZpbGUgPSAiL1VzZXJzL3lhbmdkaS9EZXNrdG9wL2ltcG9ydC9hbmFseXRpY19kYXRhMjAyMS5jc3YiLCBza2lwID0gMSkKYGBgCmBgYHtyfQpsaWJyYXJ5KHZpcmlkaXMpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHVzbWFwKQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHJqc29uKQpjaGlsZHBvdiRmaXBzID0gcGFzdGUoY2hpbGRwb3Ykc3RhdGVjb2RlLCBjaGlsZHBvdiRjb3VudHljb2RlLHNlcD0iIikKdXNfc3RhdGVzID0gbWFwX2RhdGEoInN0YXRlIikKdXNfY291bnRpZXMgPSBtYXBfZGF0YSgiY291bnR5IikKcGxvdF91c21hcChkYXRhPWNoaWxkcG92LCB2YWx1ZXM9InJhd3ZhbHVlIikKCiNjYW4ndCBjb21iaW5lIHVzbWFwIHdpdGggdGltZS12YXJ5aW5nIGFuaW1hdGlvbj8KCnVybCA9ICdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcGxvdGx5L2RhdGFzZXRzL21hc3Rlci9nZW9qc29uLWNvdW50aWVzLWZpcHMuanNvbicKY291bnRpZXMgPSByanNvbjo6ZnJvbUpTT04oZmlsZT11cmwpCmcgPC0gbGlzdCgKICBzY29wZSA9ICd1c2EnLAogIHByb2plY3Rpb24gPSBsaXN0KHR5cGUgPSAnYWxiZXJzIHVzYScpLAogIHNob3dsYWtlcyA9IFRSVUUsCiAgbGFrZWNvbG9yID0gdG9SR0IoJ3doaXRlJykKKQpjaGlsZHBvdiR5ZWFyc3Bhbj1hcy5pbnRlZ2VyKGNoaWxkcG92JHllYXJzcGFuKQpwbG90bWFwMSA9IHBsb3RfbHkoZ2VvanNvbj1jb3VudGllcywgbG9jYXRpb25zPWNoaWxkcG92JGZpcHMsIHo9Y2hpbGRwb3YkcmF3dmFsdWUsIGNvbG9yc2NhbGU9IlZpcmlkaXMiLCB6bWluPTAsIHptYXg9MSwgZnJhbWU9Y2hpbGRwb3YkeWVhcnNwYW4sIHR5cGU9J2Nob3JvcGxldGgnKQpwbG90bWFwMj1wbG90bWFwMSAlPiUKICBsYXlvdXQodGl0bGU9J0NoaWxkIHBvdmVydHknLAogICAgICAgICBnZW8gPSBnKQpwcmludChwbG90bWFwMikKYGBgCgogJT4lIAogIGFuaW1hdGlvbl9vcHRzKAogICAgZnJhbWUgPSAxMDAsIAogICAgdHJhbnNpdGlvbiA9IDAsIAogICAgcmVkcmF3ID0gRkFMU0UpICU+JQogIGFuaW1hdGlvbl9zbGlkZXIoCiAgICBjdXJyZW50dmFsdWU9bGlzdChwcmVmaXg9InllYXJzcGFuIikpICU+JQogIGFuaW1hdGlvbl9idXR0b24oCiAgICB4ID0gMSwgeGFuY2hvciA9ICJyaWdodCIsIHkgPSAwLCB5YW5jaG9yID0gImJvdHRvbSIpCkFkZCBhIG5ldyBjaHVuayBieSBjbGlja2luZyB0aGUgKkluc2VydCBDaHVuayogYnV0dG9uIG9uIHRoZSB0b29sYmFyIG9yIGJ5IHByZXNzaW5nICpDbWQrT3B0aW9uK0kqLgoKV2hlbiB5b3Ugc2F2ZSB0aGUgbm90ZWJvb2ssIGFuIEhUTUwgZmlsZSBjb250YWluaW5nIHRoZSBjb2RlIGFuZCBvdXRwdXQgd2lsbCBiZSBzYXZlZCBhbG9uZ3NpZGUgaXQgKGNsaWNrIHRoZSAqUHJldmlldyogYnV0dG9uIG9yIHByZXNzICpDbWQrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4gCgpUaGUgcHJldmlldyBzaG93cyB5b3UgYSByZW5kZXJlZCBIVE1MIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBlZGl0b3IuIENvbnNlcXVlbnRseSwgdW5saWtlICpLbml0KiwgKlByZXZpZXcqIGRvZXMgbm90IHJ1biBhbnkgUiBjb2RlIGNodW5rcy4gSW5zdGVhZCwgdGhlIG91dHB1dCBvZiB0aGUgY2h1bmsgd2hlbiBpdCB3YXMgbGFzdCBydW4gaW4gdGhlIGVkaXRvciBpcyBkaXNwbGF5ZWQuCgo=